/**
 * 
 */
package sistema.contexto.linguagem.dao;

import java.io.File;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import sistema.contexto.linguagem.LinguagemIF;
import util.InvalidFileException;

/**
 * TODO: Verificar a necessiade de criar um arquivo antes do objeto ser criado
 * @author Thiago Emmanuel Pereira da Cunha Silva, thiago.manel@gmail.com
 * @since 16/04/2006
 */
public class LinguagemXMLDAO implements LinguagemDAO {

	private String rootDirectory;
	private final String baseFile =   "linguagens.xml";//FIXME: TIRA ISSO DAQUI
	private Map<String, LinguagemIF> linguagens;

	public LinguagemXMLDAO() {
		this("data");
	}
	
	public LinguagemXMLDAO(String rootDirectory){
		setRootDirectory(rootDirectory);
		this.linguagens = fromData();
	}
	
	/**
	 * 
	 * @param root
	 */
	public void setRootDirectory (String root){
		this.rootDirectory = root;
	}
	
	/* (non-Javadoc)
	 * @see sistema.contexto.linguagem.LinguagemDAO#addLinguagem(sistema.contexto.linguagem.Linguagem)
	 */
	public void addLinguagem(LinguagemIF linguagem) {
		this.linguagens.put(linguagem.getIdentificador(), linguagem);
		this.toData(this.linguagens);
	}

	/* (non-Javadoc)
	 * @see sistema.contexto.linguagem.LinguagemDAO#getLinguagem(java.lang.String)
	 */
	public LinguagemIF getLinguagem(String idLinguagem) {
		return this.linguagens.get(idLinguagem);
	}
	
	/* (non-Javadoc)
	 * @see sistema.contexto.linguagem.LinguagemDAO#getLinguagens()
	 */
	public Collection<LinguagemIF> getLinguagens() {
		return this.linguagens.values();
	}
	
	private  void toData( Map linguagens )  {
		try {
			//TODO FIXME refazer, eh aqui mesmo essa verificacao?
			if(!new File(rootDirectory+File.separator+baseFile).exists()) {
				new File(rootDirectory+File.separator+baseFile).createNewFile();
			}
			new LinguagemFileWritter().processFile(rootDirectory+File.separator+baseFile, linguagens);
		} catch (Exception e) {
			////e.printStackTrace(); //decidir quem vai tratar
		}
	}

	private Map fromData( ) {
		try {
			//TODO FIXME refazer, eh aqui mesmo essa verificacao?
			if(!new File(rootDirectory+File.separator+baseFile).exists()) {
				new File(rootDirectory+File.separator+baseFile).createNewFile();
			}
			return (Map) new LinguagemFileReader().processFile(rootDirectory+File.separator+baseFile);
		} catch (Exception e) {}
		return new HashMap<String, String>(); 
	}
	
	public void zerarDados() {
		this.linguagens = new HashMap<String,LinguagemIF>();
		this.toData(linguagens);
	}

}
